package jwt

import (
	"encoding/json"
	"errors"
	"fmt"
	"login/configcenter"
	"strings"
	"time"

	"github.com/golang-jwt/jwt/v4"
)

type Claims struct {
	RegisterTime int64 `json:"regt"`
	jwt.RegisteredClaims
}

func GenerateToken(aid string, registerTime int64) (string, int64, error) {
	expirationTime := time.Now().Add(24 * time.Hour * 7)
	claims := &Claims{
		RegisterTime: registerTime,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(expirationTime),
			IssuedAt:  jwt.NewNumericDate(time.Now()),
			Subject:   aid,
		},
	}

	token := jwt.NewWithClaims(jwt.SigningMethodES256, claims)
	kid, key := configcenter.GetPrivateKey()
	if key == nil {
		return "", 0, errors.New("private key is nil")
	}
	token.Header["kid"] = kid
	tokenString, err := token.SignedString(key)
	if err != nil {
		return "", 0, err
	}

	return tokenString, expirationTime.Unix(), nil
}

func ValidateToken(tokenString string) (*Claims, error) {
	parts := strings.Split(tokenString, ".")
	if len(parts) != 3 {
		return nil, fmt.Errorf("无效的 JWT 格式")
	}

	var header map[string]interface{}
	if data, err := jwt.DecodeSegment(parts[0]); err == nil {
		if err := json.Unmarshal(data, &header); err != nil {
			return nil, fmt.Errorf("解析 JWT Header 失败: %w", err)
		}
	} else {
		return nil, fmt.Errorf("解析 JWT Header 失败: %w", err)
	}
	if data, err := jwt.DecodeSegment(parts[1]); err == nil {
		claims := &Claims{}
		if err := json.Unmarshal(data, claims); err != nil {
			return nil, fmt.Errorf("解析 JWT Header 失败: %w", err)
		}
		return claims, nil
	} else {
		return nil, fmt.Errorf("解析 JWT Header 失败: %w", err)
	}
	/*
		kid, ok := header["kid"].(string)
		if !ok {
			return nil, fmt.Errorf("JWT Header 中缺少 kid")
		}


			key, err := v.findKey(ctx, kid)
			if err != nil {
				return nil, fmt.Errorf("获取公钥失败: %w", err)
			}
	*/

	// 转换为 RSA 公钥
	rsaKey, err := jwt.ParseECPublicKeyFromPEM([]byte(fmt.Sprintf(`
-----BEGIN CERTIFICATE-----
%s
-----END CERTIFICATE-----
`, "")))
	if err != nil {
		return nil, fmt.Errorf("解析 RSA 公钥失败: %w", err)
	}

	// 验证 JWT
	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		// 验证签名方法
		if _, ok := token.Method.(*jwt.SigningMethodECDSA); !ok {
			return nil, fmt.Errorf("不支持的签名方法: %v", token.Header["alg"])
		}
		return rsaKey, nil
	})

	if err != nil {
		return nil, fmt.Errorf("JWT 验证失败: %w", err)
	}

	if !token.Valid {
		return nil, fmt.Errorf("无效的 JWT")
	}

	claims, ok := token.Claims.(jwt.MapClaims)
	if !ok || claims.Valid() != nil {
		return nil, fmt.Errorf("无效的 JWT 声明")
	}

	/*
		// 验证必要的声明
		if err := validateClaims(claims); err != nil {
			return nil, err
		}
	*/
	return nil, nil
}
